/*
  The package definition for an OpenRA engine.
   It shares code with `mod.nix` by what is defined in `common.nix`.
   Similar to `mod.nix` it is a generic package definition,
   in order to make it easy to define multiple variants of the OpenRA engine.
   For each mod provided by the engine, a wrapper script is created,
   matching the naming convention used by `mod.nix`.
   This package could be seen as providing a set of in-tree mods,
   while the `mod.nix` packages provide a single out-of-tree mod.
*/
{
  lib,
  stdenv,
  packageAttrs,
  patchEngine,
  wrapLaunchGame,
  engine,
}:

stdenv.mkDerivation (
  lib.recursiveUpdate packageAttrs rec {
    pname = "openra_2019";
    version = "${engine.name}-${engine.version}";

    src = engine.src;

    postPatch = patchEngine "." version;

    configurePhase = ''
      runHook preConfigure

      make version VERSION=${lib.escapeShellArg version}

      runHook postConfigure
    '';

    buildFlags = [
      "DEBUG=false"
      "default"
      "man-page"
    ];

    checkTarget = "nunit test";

    installTargets = [
      "install"
      "install-linux-icons"
      "install-linux-desktop"
      "install-linux-appdata"
      "install-linux-mime"
      "install-man-page"
    ];

    postInstall = ''
      ${wrapLaunchGame "" "openra"}

      ${lib.concatStrings (
        map (mod: ''
          makeWrapper $out/bin/openra $out/bin/openra-${mod} --add-flags Game.Mod=${mod}
        '') engine.mods
      )}
    '';

    inherit (engine) pos;
    meta = {
      inherit (engine) description homepage;
    };
  }
)
